#include <iostream>
using namespace std;


/*
	继承：代码复用
		如果A继承至B,那么在A中拥有B的所有属性和行为(非静态)
	派生类对象创建的过程:		基类部分-----派生类部分
	析构过程：					派生类部分----基类部分
	派生类的大小一定大于等于基类

	基类的私有属性被继承到类派生类中，
	但是属性在派生类中处于隐藏状态，不能直接访问,如果需要初始化基类的属性，必须使用
	基类的构造方法

	QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 );

	class MyWidget : public QWidget{
	private:
		string 		calender;
	public:
		MyWidget(const string& calender, QWidget* parent = 0, Qt::WindowFlags f = 0)
			:QWidget(parent, f),
			calender(calender)
		{
	
		}
	};

	继承的时候只关心直接基类，不用关心间接基类
*/

//基类/父类
class Person{
private:
	int 		id;
	string		name;			//4
	int 		year;
	//...
public:
	//构造
	Person(int id, const string& name, int year)
		:id(id),
		name(name),
		year(year)
	{
		cout << "Person" << endl;
	}
	//析构
	~Person()
	{
		cout << "~Person" << endl;
	}
	void eat() const { cout << "eat" << endl; }
	void sleep() const { cout << "sleep" << endl; }
	//...
};

//派生类/子类
class Student : public Person{
private:
	double		score;			//8 + 12
public:
	Student(int id, const string& name, int year, int score)
		://Person(id, name, year),			//初始化基类的部分(默认去调用无参构造)
		score(score)
	{
		cout << "Student" << endl;
	}

	

	~Student()
	{
		cout << "~Student" << endl;
	}
	void study() const { cout << "study" << endl; }
};


class Monitor : public Student{
private:
	string    smart;
public:
	Monitor(int id, const string& name, int year, double score, const string& smart)
		:Student(id, name, year, score),
		smart(smart)
	{
	
	}
	void manager() const { cout << "manager" << endl; } 
};




int main(int argc, char **argv)
{
	cout << sizeof(Person) << endl;		//12
	cout << sizeof(Student) << endl;

	Student tom(1001, "tom", 55, 99.7);
	tom.eat();
	tom.sleep();

	tom.study();

	return 0;
}
